package cc.mrbird.febs.common.utils;

import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.net.URLEncoder;
import java.nio.file.Files;
import java.nio.file.Paths;

/**
 * 文件下载工具类
 * 提供模板文件和PDF文件的下载功能
 * 支持文件流的缓冲读写，提高下载性能
 * 
 * @author fank
 * @date 2021/6/9 17:00
 */
public class FileDownloadUtils {

    /**
     * 下载模板文件
     * 从指定目录读取模板文件并以流的形式下载
     * 支持中文文件名编码
     *
     * @param response HTTP响应对象
     * @param fileName 要下载的文件名
     * @throws Exception 当文件读取或下载失败时抛出异常
     */
    public static void downloadTemplate(HttpServletResponse response, String fileName) throws Exception {
        // 从指定目录读取文件
        InputStream in = Files.newInputStream(Paths.get("G:/Project/药品销售平台/drug_sales/backend/src/main/resources/template/" + fileName));
        // 使用try-with-resources确保流正确关闭
        try (BufferedInputStream fis = new BufferedInputStream(in);
             BufferedOutputStream toClient = new BufferedOutputStream(response.getOutputStream())) {
            // 重置响应
            response.reset();
            // 设置响应类型为下载
            response.setContentType("application/x-msdownload");
            // 设置文件名，使用UTF-8编码
            response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8"));
            // 使用缓冲流进行文件传输
            int len;
            while ((len = fis.read()) != -1) {
                toClient.write(len);
                toClient.flush();
            }
        } catch (IOException ex) {
            throw new Exception("下载文件失败！");
        }
    }

    /**
     * 下载PDF文件
     * 从指定路径读取PDF文件并以流的形式下载
     * 支持中文文件名编码
     *
     * @param response HTTP响应对象
     * @param fileName PDF文件的完整路径
     * @throws Exception 当文件读取或下载失败时抛出异常
     */
    public static void downloadPdf(HttpServletResponse response, String fileName) throws Exception {
        // 从指定路径读取文件
        InputStream in = new FileInputStream(fileName);
        // 使用try-with-resources确保流正确关闭
        try (BufferedInputStream fis = new BufferedInputStream(in);
             BufferedOutputStream toClient = new BufferedOutputStream(response.getOutputStream())) {
            // 重置响应
            response.reset();
            // 设置响应类型为JSON
            response.setContentType("application/json");
            // 设置文件名，使用ISO-8859-1编码
            response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName, "iso8859-1"));
            // 使用缓冲流进行文件传输
            int len;
            while ((len = fis.read()) != -1) {
                toClient.write(len);
                toClient.flush();
            }
        } catch (IOException ex) {
            throw new Exception("下载文件失败！");
        }
    }
}
